1

Conceptos básicos de avenue.quark

Mucha gente quiere utilizar la Web para publicar información que crea en formato QuarkXPress Passport™. Existen, por supuesto, diversas maneras de hacerlo. No obstante, la manera más eficaz consiste en separar el contenido de los documentos de QuarkXPress Passport y almacenarlo en un formato estructurado, como XML. El contenido puede volver a utilizarse tanto en la Web como en otros formatos: publicaciones impresas, CD-ROM, etc.

El software avenue.quark™ está diseñado para facilitar la extracción del contenido de QuarkXPress Passport y su almacenamiento en formato XML.


Descripción general de XML

Avenue.quark permite extraer el contenido de los documentos de QuarkXPress Passport y almacenarlo en formato XML. El contenido puede volver a utilizarse fácilmente de diversas maneras, incluso en la Web. En este apartado se resumen el proceso y las definiciones; los apartados posteriores contienen descripciones más detalladas.


¿Qué es el contenido?

El contenido es la información que da valor a los documentos. Por ejemplo, el contenido de una revista puede incluir artículos, fotografías, entrevistas y diagramas.

También se puede definir el contenido por lo que no incluye. Por ejemplo, las cabeceras, los pies de página y las notas "Continúa en la página x" no se consideran normalmente parte del contenido de una revista. Mejor dicho, forman parte de la presentación de la revista: aspectos de la revista que se necesitan sólo si ésta sale en formato impreso. La presentación puede cambiar según el medio en que se edita la información, pero en la mayoría de los casos el contenido permanece igual.

Avenue.quark permite separar el contenido de la presentación mediante la extracción del contenido de los documentos de QuarkXPress Passport y su almacenamiento en formato XML. El contenido puede volver a utilizarse con distintas presentaciones: en publicaciones impresas, en la Web, en CD-ROM, etc. Sólo es necesario ajustar la presentación para cada caso.


¿Qué es XML?

XML son las siglas en inglés para Extensible Markup Language (lenguaje extensible de marcación). XML sirve para especificar la estructura del contenido y etiquetar los segmentos del mismo de un modo significativo.

Etiquetado del contenido

¿Por qué es necesario etiquetar el contenido? Porque, si bien con la simple inspección ocular de una revista sabemos que una determinada línea de texto es un titular, estas distinciones no son tan fáciles para un ordenador. XML permite "etiquetar" la información de modo que los ordenadores la puedan entender. Una vez que un ordenador sepa que una determinada línea de texto es un titular, podrá formatearla automáticamente como titular.

Para etiquetar un segmento de contenido en XML, se puede insertar una etiqueta de XML de comienzo antes del contenido y otra de fin después, de esta manera:

<titular>Internet crece en un 400%</titular>

Como puede ver, una etiqueta de comienzo consiste en el nombre de un elemento entre estos símbolos: < y >. Una etiqueta de fin es lo mismo salvo que tiene / después del símbolo <. En este ejemplo, hemos "etiquetado" el texto "Internet crece en un 400%" como un titular colocándolo entre las etiquetas <titular> de comienzo y de fin.

Identificación de estructuras

Sabemos que un reportaje informativo consiste normalmente en un titular, firma, texto principal y algunas fotografías o diagramas con pies de ilustración. Sin embargo, los ordenadores no conocen estos elementos hasta que se les indica.

XML permite describir la estructura de los documentos con definiciones del tipo de documento (DTD). Una DTD especifica que la información en un documento utilice un determinado conjunto de etiquetas y siga un determinado conjunto de reglas de estructura. Por ejemplo, una DTD para un reportaje informativo podría especificar que:

Con adherirse coherentemente a las reglas de una definición DTD, una empresa puede garantizar que sus documentos tengan siempre una estructura predecible y uniforme. Esto simplifica mucho más a las empresas el traslado de contenido de un medio a otro; por ejemplo, de una publicación impresa a la Web, o viceversa.

Avenue.quark requiere el uso de definiciones DTD. Encontrará información sobre cómo crear y adaptar definiciones DTD en los apartados "Utilización de definiciones DTD" y "Definiciones DTD estándar de la industria", en este mismo capítulo.


Un formato "neutro"

XML es un formato "neutro" ya que no contiene información de formato. Debido a esto, se puede utilizar con una amplia variedad de aplicaciones, las cuales pueden aplicar distintos tipos de formato en función del medio utilizado para presentar el contenido.

Encontrará una explicación más detallada de XML en el apartado "En qué consiste XML", en este mismo capítulo.



¿Qué puedo hacer con el contenido almacenado en formato XML?

Una vez que haya extraído el contenido de un documento de QuarkXPress Passport, podrá utilizarlo de diversas maneras. Por ejemplo, puede convertir contenido con etiquetas de XML en formato HTML y distribuirlo en la Web. Este método de convertir el contenido de QuarkXPress Passport en HTML es mejor que la mera exportación a HTML porque le permite formatear, reformatear y reorganizar fácilmente el contenido.


En qué consiste XML

Ahora que tiene una idea general de lo que es avenue.quark y cómo funciona, vamos a examinarlo detalladamente, comenzando con un repaso de XML.

XML (Extensible Markup Language; lenguaje extensible de marcación) es una manera de especificar la estructura de los documentos y marcar segmentos específicos del contenido con etiquetas. Mediante los controles estructurales de XML es posible asegurarse de que se encuentren todos los componentes necesarios del documento y que aparezcan en el orden correcto. El marcado del contenido facilita que otras aplicaciones utilicen o muestren el contenido.

No obstante, antes de examinar cómo XML realiza todo esto, vamos a explicar por qué es necesario.


Problemas resueltos por XML

XML se derivó de un lenguaje de marcación anterior y más complicado, denominado SGML (Standard Generalized Markup Language; lenguaje de marcación generalizada estándar). Se creó XML para resolver diversos problemas relacionados, algunos de los cuales fueron resueltos por SGML, y otros que son únicos.

Asignación de estructura y etiquetas a información

XML se conoce a veces como "metalenguaje" porque permite definir lenguajes de marcación personalizados para usos específicos. Esto se hace creando una definición del tipo de documento (DTD), la cual especifica el tipo de información que un documento puede contener, la manera en que se deben etiquetar los distintos componentes del documento, el orden en que deben aparecer los componentes y la cantidad de cada componente que se permite. Un documento se considera "válido" según una DTD específica sólo si sigue las reglas de esa DTD.

Las definiciones DTD hacen posible controlar la estructura de los documentos. Si se dispone de la DTD de un documento, se conoce el tipo de información que se espera encontrar al abrir el documento. Las DTD también facilitan el procesamiento de la información en documentos en formato XML por parte de los ordenadores; si un ordenador puede "entender" una DTD, puede "entender" la información contenida en cualquier documento de XML que se atenga a dicha DTD. Por ejemplo, con la DTD de un documento un programa informático podría permitir la búsqueda en cada caso de un determinado tipo de información (como nombre de la empresa) en el documento, o producir una página HTML que contenga una lista de todos los casos de ese tipo de información (por ejemplo, una lista de nombres de empresa).

Ya se han desarrollado DTD especiales para química, matemáticas, documentación técnica e incluso obras de ficción. Entre las aplicaciones posibles se incluyen el control del flujo de trabajo, la especificación de sofware, y poco más o menos cualquier otro campo que implique el intercambio de información estructurada.

Como nota al margen: a diferencia de SGML, XML permite crear documentos "bien formados"; es decir, documentos que siguen las reglas de XML pero no siguen una DTD determinada. No obstante, es difícil mantener coherencia entre los documentos si no se cuenta con una norma, y por este motivo, avenue.quark requiere el uso de definiciones DTD.


Aclaración de HTML

HTML ha demostrado ser un formato potente y flexible para presentar información en la Web. No obstante, tiene dos defectos importantes: describe sólo el formato de los datos, no su significado, y no se puede utilizar para crear nuevas etiquetas HTML.

XML resuelve estos dos problemas. Si se utiliza XML para etiquetar los datos de un documento de XML, los formatos HTML se pueden basar en esas etiquetas. Por ejemplo, supongamos que tiene un documento de XML que incluye una lista de empresas e información acerca de cada una de éstas. Para transformar la lista en una página Web en formato HTML con los nombres de todas las empresas en negrita, tan sólo se tiene que utilizar un convertidor de XML-HTML e indicar al mismo que ponga en negrita cada línea con la etiqueta <empresa>. Esto significa que ya no es necesario formatear manualmente cada nombre de empresa y dirección. El posible ahorro de tiempo para los desarrolladores de sitios Web es enorme.

Intercambio de información

Debido a que los programas informáticos se han desarrollado por distintas personas y empresas para diversos usos, almacenan información en muchos formatos diferentes. Por ejemplo, dos empresas distintas pueden almacenar la información de sus clientes en dos formatos completamente diferentes, aunque dicha información (nombre, dirección, número de teléfono, etc.) sea más o menos idéntica.

XML resuelve este tipo de problema mediante un formato estándar no exclusivo para la transferencia de información entre aplicaciones. Un grupo de profesionales procedentes de distintas industrias, que se unieron como parte del World Wide Web Consortium (el W3C), desarrolló, perfeccionó y aprobó XML. La especificación está a disposición de todos los que quieran utilizarla (consulte www.w3.org); muchas empresas e industrias ya la utilizan.

Si dos empresas aceptan utilizar software que convierte sus registros en XML utilizando una misma descripción DTD, podrán intercambiar esos registros cuando quieran, sin ningún riesgo de que se pierdan datos debido a formatos incompatibles. Encontrará más información acerca de las definiciones DTD y el intercambio de información en el apartado "Definiciones DTD estándar de la industria", en este mismo capítulo.

Podrá hallar una explicación más detallada de XML en el apartado "Utilización de XML", a continuación.


Utilización de XML

Los documentos de XML contienen datos estructurados que se han desglosado en "elementos", cada uno de los cuales se describe mediante etiquetas de XML.


Elementos y etiquetas de XML

Un elemento de XML contiene un dato, como el nombre de una empresa, un titular o un número de referencia. Los elementos se crean colocando un dato entre dos etiquetas de XML: una etiqueta de comienzo que contiene el nombre del elemento entre los símbolos menor que y mayor que, y una etiqueta de fin que es igual salvo por la inclusión de una barra inclinada (/) antes del nombre del elemento. Por ejemplo, un elemento con la etiqueta "nombre" podría aparecer de esta manera:

<nombre>Gabriela</nombre>

Es importante entender la diferencia entre un elemento de XML y una etiqueta de XML. Esta última es simplemente la etiqueta que se conecta a un dato; un elemento de XML incluye tanto el dato como las etiquetas que lo encierran.


Las etiquetas de XML permiten describir y añadir estructura a los datos que encierran. Por ejemplo, el siguiente párrafo de introducción tiene la etiqueta <introducción>:

<introducción>
Frank Lloyd Wright fue uno de los mejores y más famosos arquitectos de los Estados Unidos. Ésta es su historia.
</introducción>

Dentro del elemento <introducción>, es posible etiquetar otros subelementos a fin de estructurar más el documento:

<introducción>
<nombre>Frank Lloyd Wright</nombre> fue uno de los mejores y más famosos <trabajo>arquitectos</trabajo> de los Estados Unidos. Ésta es su historia.
</introducción>

La sintaxis es importante para las etiquetas de XML. A diferencia de las etiquetas HTML, las de XML son sensibles a mayúsculas y minúsculas; la etiqueta <Nombre> es diferente de la etiqueta <nombre>, que a su vez es diferente de la etiqueta <NOMBRE>. El nombre de cada etiqueta de XML debe comenzar con una letra o un subrayado (_); los caracteres siguientes en el nombre pueden ser letras, subrayados, números, guiones y puntos, pero no espacios ni tabulaciones. Por ejemplo, el nombre de etiqueta de XML <_.dir> es correcto, pero los nombres <_ dir> y <.dir> no lo son. El nombre de etiqueta <_ dir> no es correcto porque incluye un espacio en blanco (una tabulación o un espacio) después del subrayado. El nombre de etiqueta <.dir> no es correcto porque comienza con un punto en vez de con un subrayado o letra.


Conviene conocer la diferencia entre los "elementos" y "tipos de elementos". Un tipo de elemento se puede considerar un nombre de etiqueta específico que se puede aplicar a los datos; un elemento es un dato y las etiquetas que lo encierran. Por ejemplo, un documento que contiene una lista de nombres y direcciones podría tener sólo dos tipos de elementos, <nombre> y <dirección>, pero cientos de elementos que utilicen estas etiquetas.



Atributos de XML

Supongamos que está trabajando con elementos etiquetados <coche> y desea poder especificar información adicional acerca de cada elemento <coche> que cree. Por ejemplo, desea poder ampliar la designación de un elemento <coche> específico para que indique que se trata de un coche caro, rojo y rápido.

Existen varias maneras de hacerlo. Una manera implica la creación de tipos de elementos adicionales; por ejemplo:

<coche>
<velocidad>rápido</velocidad>
<color>rojo</color>
<coste>caro</coste>
1995 Geo Metro
</coche>

Otra manera (y quizás más "clara") es utilizar la característica XML de atributos. Los atributos están diseñados para proporcionar información acerca de un elemento. Se incluyen dentro de la etiqueta de comienzo de un elemento, así que no hay ninguna duda sobre con qué elemento están relacionados.

Un atributo consta de un nombre de atributo, seguido de un signo igual y un valor de atributo entre comillas. Por ejemplo, el siguiente elemento emplea tres atributos para proporcionar la misma información que en el ejemplo anterior:

<coche velocidad="rápido" color="rojo" coste="caro">
1995 Geo Metro
</coche>

Los atributos son útiles por varios motivos. Por ejemplo, facilitan la búsqueda en un documento y generan una lista de todos los elementos <coche> que contienen el valor "caro" en el atributo de coste. También pueden ser de utilidad en combinación con elementos vacíos (el siguiente punto contiene información más detallada).


Elementos vacíos

Los elementos vacíos incluyen una etiqueta de comienzo y otra de fin, y no encierran ningún dato; por ejemplo:

<número_identificación></número_identificación>

Debido a que los elementos vacíos no incluyen ningún contenido entres sus etiquetas de comienzo y de fin, éstas suelen combinarse; por ejemplo:

<número_identificación/>

Se pueden utilizar atributos junto con elementos vacíos para hacer referencia a localizadores URL o a archivos almacenados de forma externa. Por ejemplo, el siguiente elemento vacío se podría utilizar (con un traductor de XML adecuado) para mostrar la foto de un coche:

<foto_coche URL="1995GeoMetro.jpg"/>

Tenga en cuenta que el hecho de añadir un atributo con el nombre "URL" a un elemento no garantiza que se acceda al URL al procesarse el archivo de XML. La aplicación que procese el archivo debe saber qué hacer con el atributo URL.



Comentarios

Al igual que con HTML, es posible incluir comentarios en un archivo de XML. Los comentarios se encierran entre <!-- y -->, y básicamente los procesadores de XML no los tienen en cuenta. Por tanto, para insertar un comentario sobre el estado de un elemento <dirección>, podría hacer lo siguiente:

<dirección>
<!-- Contabilidad tiene que proporcionar esta dirección. -->
</dirección>


Instrucciones de procesamiento

En HTML, se suelen utilizar comentarios que contienen comandos especiales para examinadores y otros procesadores HTML. Para conseguir que los comentarios de XML sean estrictamente comentarios, los autores de la especificación XML han incluido un método para insertar comandos personalizados en archivos de XML y definiciones DTD. Dichos comandos personalizados, conocidos como instrucciones de procesamiento ("processing instructions" o "PI"), se encierran simplemente entre <? y ?>. Comienzan con el nombre de una aplicación, seguido de un espacio y cualquier información que pudiese ser de interés para la aplicación referida. Las instrucciones de procesamiento se pueden utilizar en cualquier lugar donde pueden aparecer comentarios.


Declaración de XML

Cada documento de XML puede y debe comenzar con una declaración de XML. Al igual que con una instrucción de procesamiento, una declaración de XML se encierra entre <? y ?>. A continuación se ofrece un ejemplo de una declaración de XML:

<?xml version="1.0" standalone="yes"?>

El atributo "version" declara que este documento se atiene a las reglas de XML 1.0. El atributo "standalone" indica que todas las declaraciones de marcación necesarias para procesar este documento de XML se incluyen en el documento.


Referencias a entidades

Las referencias a entidades son una palabra que sirve de atajo para un carácter, cadena o archivo. Por ejemplo, al utilizar la referencia a entidad &lt; para representar el carácter menor que (<) en el contenido de un documento de XML, se puede evitar confundir al analizador de XML (el cual, de lo contrario, interpretaría el carácter "<" como el comienzo de una etiqueta). Encontrará más información sobre las referencias a entidades en "Utilización de referencias a entidades" del apartado "Utilización de definiciones DTD", en este mismo capítulo.


XML bien formado

Para que un documento de XML esté bien formado, puede y debe comenzar con una declaración de XML y tener un elemento raíz que contenga todos los demás elementos (<artículo> en el siguiente ejemplo). También es necesario que todos los elementos del documento tengan una etiqueta de fin correspondiente. A continuación se ofrece un ejemplo de un documento de XML bien formado:

<?xml version="1.0" standalone="yes"?>
<artículo>
<avance_informativo>
<título>Se cierra el Museo Forney</título>
<autor>Linda Spano</autor>
<contenido>
El Museo de Transporte Forney cierra sus puertas la semana que viene.
</contenido>
</avance_informativo>
</artículo>


XML válido

Un documento de XML bien formado puede tener una utilidad limitada a menos que también sea válido. Un documento de XML se considera válido cuando se adhiere a las especificaciones de una definición DTD concreta. Encontrará más información acerca de las definiciones DTD y cómo validar los documentos de XML en el apartado "Utilización de definiciones DTD", en este mismo capítulo.


Procesadores de XML

Un procesador de XML es, en términos básicos, un programa que lee un archivo de XML y lo procesa de alguna forma. Existen varios tipos de procesadores de XML. Un procesador de XML podría convertir un archivo de XML en una página Web en formato HTML, en un archivo PDF o en un archivo PostScript. O bien podría leer en voz hablada el contenido del archivo de XML o convertirlo en braille. Un procesador de XML podría incluso utilizarse para copiar contenido de XML estructurado y colocarlo en una base de datos.

Analizadores de XML

Un analizador de XML reconoce las reglas de XML y verifica si un documento de XML está bien formado. Sin embargo, un analizador de XML no verifica necesariamente si un documento de XML es válido según su definición DTD; esto requiere un analizador de XML de validación (véase a continuación).

Analizadores de XML de validación

Los analizadores de XML de validación comparan un documento de XML con una definición DTD y verifican si el documento se ajusta a las reglas de la DTD. Un analizador de validación bueno también proporcionará comentarios constructivos sobre cualquier problema que encuentre en el archivo de XML. Encontrará más información acerca de los analizadores de XML en el apartado "Utilización de definiciones DTD", en este mismo capítulo.

Si desea ver una referencia rápida de las características y convenciones de XML, consulte el Apéndice A, "Referencia rápida para XML", en el capítulo 7, "Apéndices".



Utilización de definiciones DTD

Una definición del tipo de documento (DTD) especifica los elementos que un archivo de XML puede contener y la estructura que dichos elementos deben tener. No es obligatorio que los documentos de XML tengan una DTD correspondiente; siempre y cuando un archivo de XML siga la sintaxis de XML básica, se considera estar "bien formado" y se puede leer por una aplicación compatible con XML. No obstante, un archivo de XML sólo se puede considerar "válido" si se atiene a una DTD determinada.

Las DTD son importantes porque proporcionan una estructura fiable y bien documentada para los documentos de XML. Sin las DTD, es posible que dos empresas que colaboran en proyectos decidan cada una estructurar y etiquetar los documentos de XML a su manera, por lo que sus bancos de datos seguirán siendo incompatibles después de que ambas hayan pasado a utilizar XML. Sin embargo, si las dos empresas tienen la misma DTD (tal vez una DTD que hayan desarrollado juntas o una que ya sea estándar en su industria), podrán intercambiar información de forma fácil y predecible.


DTD externas e internas

Hay dos tipos de DTD: externas e internas.

En términos técnicos, una DTD consta de una lista de declaraciones de marcación (declaraciones de elementos y de atributos, entidades, anotaciones, instrucciones de procesamiento y comentarios) a la que se hace referencia mediante una declaración DOCTYPE. Las "DTD externas" y "DTD internas" mencionadas en este documento no son técnicamente DTD completas; no obstante, llamarlas así es una práctica conveniente y común.


DTD externas

Una DTD externa (o subconjunto externo) es un archivo que contiene una lista de declaraciones de marcación. Las DTD externas se comparten fácilmente entre documentos de XML y empresas. Para utilizar una DTD externa en un archivo de XML, basta con hacer referencia a la misma al comienzo del archivo de XML; por ejemplo:

<?xml version="1.0" standalone="no">
<!-- La siguiente línea especifica un elemento raíz (<mi_documento>) y apunta al URL del archivo de una DTD externa con el nombre. "midocumento.dtd" -->
<!DOCTYPE mi_documento SYSTEM "http://www.quark.com/mi_documento.dtd">
<!-- El documento empieza aquí. -->
<midocumento>
Cuando las leyes se proscriban, sólo los proscritos seguirán las reglas.
</mi_documento>

DTD internas

Una DTD interna (o subconjunto interno) se incluye directamente en el archivo de XML que describe. Para utilizar una DTD interna en un archivo de XML, basta con añadirla al comienzo del archivo de XML; por ejemplo:

<?xml version="1.0" standalone="yes">
<!-- La siguiente línea especifica un elemento raíz (<mi_documento>) y significa el comienzo de la DTD. -->
<!DOCTYPE mi_documento [
<!-- La DTD interna empieza aquí. -->
<!ELEMENT mi_documento ANY>
<!-- Fin de DTD -->
]>
<!-- El documento empieza aquí. -->
<mi_documento>
Cuando las leyes se proscriban, sólo los proscritos seguirán las reglas.
</mi_documento>

Si un documento utiliza una DTD externa (o cualquier otro tipo de entidad externa), el atributo "standalone" en la primera línea debe establecerse en "no". Encontrará más información en "Utilización de referencias a entidades", en este mismo capítulo.


Combinación de DTD internas y externas

En cualquier documento de XML, se puede especificar una DTD externa y luego complementar o anular esa DTD con una DTD interna. El ejemplo siguiente muestra la estructura que podría tener un documento de XML de este tipo.

<?xml version="1.0" standalone="no">
<!-- La siguiente línea especifica un elemento raíz (<mi_documento>), apunta al URL del archivo de una DTD externa con el nombre "mi_documento.dtd" y significa el comienzo de la DTD interna. -->
<!DOCTYPE mi_documento SYSTEM "http://www.quark.com/mi_documento.dtd" [
<!-- La DTD interna se inserta aquí; podría añadir nuevos tipos de elementos a parte de los tipos de elementos definidos en la DTD externa. -->
<!ELEMENT mi_elemento_DTD_local ANY>
<!-- Fin de DTD -->
]>
<!-- El documento empieza aquí. -->
<mi_documento>
<mi_elemento_DTD_local>
Cuando las leyes se proscriban, sólo los proscritos seguirán las reglas.
</mi_elemento_DTD_local>
</mi_documento>


Planificación de una DTD

La creación correcta de una DTD requiere una planificación concienzuda antes de redactarla.

Antes de comenzar el proceso de crear su propia DTD, le convendría considerar utilizar una DTD estándar de la industria. Encontrará más información acerca de esta opción en el apartado "Definiciones DTD estándar de la industria", en este mismo capítulo.


Un buen punto de partida es determinar exactamente la función deseada de la DTD. En primer lugar, defina qué elementos desea utilizar. Si desea emplear elementos tales como <dirección>, decida si desea subdividir esos elementos en subelementos, como <calle_número>, <número_unidad>, <localidad>, <provincia> y <código_postal>. (Considere detenidamente estas subdivisiones, sobre todo si existe alguna posibilidad de que termine transfiriendo el contenido de los archivos de XML a una base de datos.)

Bueno, esto ha sido la parte fácil. Ahora necesita determinar las relaciones entre todos estos elementos. Una DTD puede especificar los elementos permitidos, el orden en que deben aparecer y los subelementos (y la cantidad) que pueden contener. Puede especificar los otros elementos que pueden contener un determinado elemento, así como si un determinado elemento debe o no contener datos.

Eliotte Rusty Harold, en el documento XML: Extensible Markup Language, recomienda utilizar una tabla para ayudar a determinar las relaciones entre los distintos elementos en la DTD. La tabla debería tener las siguientes columnas (los datos en las columnas se ofrecen como ejemplo solamente):

Nombre del elemento Debe contener Puede contener Debe aparecer en
<dirección> <calle_número>,<localidad>, <provincia>,<código_postal> <atención> <datos_personales>
<calle_número> <dirección>

Cada fila de la tabla debería representar un elemento que desee utilizar en su DTD.


Utilización de una DTD

Al igual que con un archivo de XML, una DTD consta de texto común. Un archivo de XML puede utilizar ninguna DTD, una DTD externa, una DTD interna o tanto una DTD externa como interna.

Independientemente del tipo de DTD que un documento de XML utilice, debe hacer referencia a o incluir esa DTD en su prólogo (sección de comienzo), exactamente después de la declaración de XML y antes del cuerpo del documento de XML. La sección DTD comienza con "<!DOCTYPE nombre_raíz [" y termina con "]>". A continuación se ofrece un ejemplo de un documento de XML íntegro que contiene una DTD completa (en negrita):

<?xml version="1.0" standalone="yes">
<!-- La DTD empieza aquí. -->
<!DOCTYPE mensaje [
<!ELEMENT mensaje ANY>
]>
<!-- El documento empieza aquí. -->
<mensaje>
Cuando las leyes se proscriban, sólo los proscritos seguirán las reglas.
</mensaje>

Analicemos algunos de los segmentos:

Como puede ver, la definición de cada tipo de elemento especifica el nombre del elemento y el tipo de datos que el elemento puede contener. Si quisiera cambiar la definición del tipo de elemento para <mensaje> con objeto de que pudiera contener texto y sólo texto (es decir, ningún otro elemento), podría hacerlo cambiando la palabra clave "ANY" a "(#PCDATA)"; por ejemplo:

<?xml version="1.0" standalone="yes">
<!-- La DTD empieza aquí. -->
<!DOCTYPE mensaje [
<!ELEMENT mensaje (#PCDATA)>
]>
<!-- El documento empieza aquí. -->
<mensaje>
Cuando las leyes se proscriban, sólo los proscritos seguirán las reglas.
</mensaje>

Sin embargo, es probable que no le convenga hacer esto porque significaría que el elemento raíz del documento podría contener solamente datos alfanuméricos analizados (consulte la siguiente nota); no le sería posible añadir más elementos a fin de subdividir la información.

"PCDATA" significa "parsed character data" (datos alfanuméricos analizados): es decir, texto que puede incluir referencias a entitades, comentarios e instrucciones de procesamiento.


Examinemos una DTD más realista. La siguiente DTD interna define una estructura para una guía de sucursales:

<!-- El elemento raíz es <guía_sucursales>. -->
<!ELEMENT guía_sucursales ANY>
<!ELEMENT calle_número (#PCDATA)>
<!ELEMENT localidad (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT código_postal (#PCDATA)>
<!ELEMENT país (#PCDATA)>
<!ELEMENT teléfono (#PCDATA)>
<!ELEMENT fax (#PCDATA)>
<!ELEMENT correo_electrónico (#PCDATA)>

Observe que hemos insertado un comentario que indica que <guía_sucursales> es el elemento raíz de la DTD. Hicimos esto porque una DTD no puede designar explícitamente un elemento raíz. La especificación de un elemento raíz es, en teoría, el trabajo de la línea !DOCTYPE en un documento de XML; no obstante, conviene especificar los elementos raíz con un comentario para que los usuarios de la DTD puedan ver lo que son.

Es posible que algunas DTD contengan más de un elemento que pueda servir de elemento raíz. Por ejemplo, se puede crear una DTD que contenga definiciones tanto para documentos de informes de tecnología como para documentos de preguntas frecuentes, y luego utilizar esa DTD para crear ambos tipos de documento especificando <whitePaper> o <preguntas_frecuentes> como el elemento raíz de cada archivo de XML.


Las restantes líneas en la DTD declaran elementos para la dirección de la calle-número, localidad, estado, código postal, país, número de teléfono, número de fax y dirección de correo electrónico de cada oficina.


Control de la selección y el orden de etiquetas

Puede que la anterior DTD sirva adecuadamente para sus necesidades, pero no aprovecha realmente las características de XML. Por ejemplo, no especifica ningún modo de indicar los elementos de dirección y las oficinas que van juntos, ni ningún orden en particular para la información. Por tanto, sería posible crear un documento que contenga todas las distintas localidades, calles, números de teléfono, etc. en orden aleatorio y que sea válido según esta DTD.

Para que la DTD tenga una estructura significativa, se debe contar con una manera de reunir todos los elementos componentes de cada lista y colocarlos en un orden específico. Una manera de hacerlo es crear un elemento contenedor para incluir la información pertinente a una oficina (le pondremos el nombre <sucursal>), y luego especificar tanto los subelementos que deben componer ese elemento contenedor como el orden en que deben aparecer. Se puede conseguir todo esto añadiendo una línea a la DTD (en negrita):

<!-- El elemento raíz es <guía_sucursales>. -->
<!ELEMENT guía_sucursales ANY>
<!ELEMENT calle_número (#PCDATA)>
<!ELEMENT localidad (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT código_postal (#PCDATA)>
<!ELEMENT país (#PCDATA)>
<!ELEMENT teléfono (#PCDATA)>
<!ELEMENT fax (#PCDATA)>
<!ELEMENT correo_electrónico (#PCDATA)>
<!ELEMENT sucursal (calle_número, localidad, provincia, código_postal, país, teléfono, fax, correo_electrónico)>

Lo que dice este nuevo elemento es "si el documento contiene un elemento con el nombre <sucursal>, ese elemento debe contener exactamente uno de cada uno de los siguientes elementos, en este orden, y nada más".

¿Qué ocurre si las direcciones de la calle-número de algunas sucursales abarcan más de una línea? Al añadir un signo más, +, al final del nombre de cualquier elemento en una lista de subelementos, se permite que ese elemento aparezca más de una vez. Por ejemplo, para permitir uno o más elementos <calle_número> del elemento <sucursal>, se podría hacer lo siguiente:

<!ELEMENT sucursal (calle_número+, localidad, provincia, código_postal, país, teléfono, fax, correo_electrónico)>

¿Qué ocurre si algunas de las sucursales no tienen máquinas de fax? ¿Y qué ocurre si algunas tienen más de una? Para especificar cero o más casos de un elemento, ponga un asterisco, *, al final del nombre del elemento; por ejemplo:

<!ELEMENT sucursal (calle_número+, localidad, provincia, código_postal, país, teléfono, fax*, correo_electrónico)>

Además, ¿qué ocurre si las sucursales se encuentran en un país donde no existen los códigos postales? Para especificar que pueda haber cero o un caso de un determinado elemento, añada un signo de interrogación, ?, al final del nombre del elemento; por ejemplo:

<!ELEMENT sucursal (calle_número+, localidad, provincia, código_postal?, país, teléfono, fax*, correo_electrónico)>

Lo que se conoce como "estado" en los Estados Unidos puede tener un nombre diferente en otros lugares. Canadá, por ejemplo, está dividido en provincias. Si tiene oficinas en los Estados Unidos y en Canadá, conviene que incluya la opción de utilizar un elemento <provincia> o uno <estado>. Para ello, coloque las dos opciones entre paréntesis, separadas por un carácter |; por ejemplo:

<!ELEMENT sucursal (calle_número+, localidad, (provincia|estado), código_postal?, país, teléfono, fax*, correo_electrónico)>

Por último, es posible asegurarse de que un elemento <guía_sucursales> consta exclusivamente de listas de elementos <sucursal> cambiando la definición de <guía_sucursal> de ANY a (sucursal*). Éste es el producto final:

<!-- El elemento raíz es <guía_sucursales>. -->
<!ELEMENT guía_sucursales (sucursal*)>
<!ELEMENT calle_número (#PCDATA)>
<!ELEMENT localidad (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT estado (#PCDATA)>
<!ELEMENT código_postal (#PCDATA)>
<!ELEMENT país (#PCDATA)>
<!ELEMENT teléfono (#PCDATA)>
<!ELEMENT fax (#PCDATA)>
<!ELEMENT correo_electrónico (#PCDATA)>
<!ELEMENT sucursal (calle_número+, localidad, (provincia|estado), código_postal?, país, teléfono, fax*, correo_electrónico)>

En resumen:

SímboloSignificado
NingunoExactamente uno
+Uno o más
*Cero o más
?Cero o uno

Los símbolos especiales se pueden utilizar conjuntamente con el paréntesis para crear declaraciones de tipo de elemento complejo, como la siguiente DTD, diseñadas con objeto de mostrar la información de contacto de forma diaria:

<!-- El elemento raíz es <lista_contactos>. -->
<!ELEMENT lista_contactos (información_contactos*)>
<!ELEMENT teléfono_oficina (#PCDATA)>
<!ELEMENT fecha (#PCDATA)>
<!ELEMENT fax_oficina (#PCDATA)>
<!ELEMENT teléfono_casa (#PCDATA)>
<!ELEMENT buscapersonas (#PCDATA)>
<!ELEMENT fax_casa (#PCDATA)>
<!ELEMENT alojamiento_viaje (#PCDATA)>
<!ELEMENT teléfono_viaje (#PCDATA)>
<!ELEMENT fax_viaje (#PCDATA)>
<!ELEMENT correo_electrónico (#PCDATA)>
<!ELEMENT Mensaje (#PCDATA)>
<!ELEMENT información_contactos (fecha, ((teléfono_oficina, fax_oficina*, correo_electrónico) | ((teléfono_casa | teéfono_casa | buscapersonas)+, (fax_casa* | fax_oficina*), correo_electrónico)), Mensaje?)>

En cualquier momento dado, el sujeto de esta lista podría estar en la oficina, en casa o de viaje de negocios. Por tanto, cada elemento <información_contactos> puede incluir una de las siguientes listas de información, con subelementos en el orden indicado:


Permitir etiquetas vacías

Podría convenir redactar los documentos de XML de modo que se puedan convertir fácilmente en formato HTML. Si éste es el caso, quizás desee incluir etiquetas tales como <BR> y <HR> en el archivo de XML con vistas a convertirlas literalmente en el archivo HTML.

No se puede hacer esto de forma intrínseca en XML porque todos los elementos deben tener una etiqueta de fin. Sin embargo, es posible crear lo que se denomina etiquetas EMPTY (vacías) y dejar que un convertidor de XML-HTML se encargue de convertirlas en las etiquetas de salida correctas. Por ejemplo, para permitir la creación de etiquetas <HR>, habría que incluir la siguiente línea en la DTD:

<!ELEMENT HR EMPTY>

Para utilizar esta etiqueta, se podría insertar una línea como la siguiente en el archivo de XML:

<HR/>

No se la puede incluir como "<HR>" debido a que todos las etiquetas de XML deben tener una etiqueta de fin o terminar con una barra inclinada. Sin embargo, no hay ningún problema porque un convertidor de XML-HTML debería convertir la línea <HR/> en <HR>.

Las etiquetas EMPTY se suelen utilizar para contener imágenes. El URL de los datos de la imagen se almacena en uno de los atributos de la etiqueta EMPTY. Encontrará más información acerca de los atributos en "Definición de atributos", en este mismo capítulo.



Utilización de referencias a caracteres

Las referencias a caracteres constituyen una manera de representar los caracteres Unicode en datos alfanuméricos analizados. La sintaxis para dichas referencias es la siguiente:

&#valor_Unicode_del_carácter;

Por ejemplo, para insertar el signo monetario del euro antes del número 500 en un elemento <cantidad>, se podría hacer lo siguiente (la referencia a carácter está en negrita):

<cantidad>&#x20AC;500</cantidad>

Corresponde al procesador de XML sustituir las entitades alfanuméricas por los caracteres Unicode adecuados durante la impresión.



Utilización de referencias a entidades

Las referencias a entidades son pequeños segmentos de texto que representan otra cosa, como un carácter, una cadena de texto, un archivo de XML almacenado externamente o un archivo binario (por ejemplo, un archivo de imagen o de sonido). Existen cinco tipos de referencias a entidades:

A continuación se describen detalladamente estos tipos de referencia a entidad.

¿Cuál es la diferencia entre una entidad y una referencia a entidad? Una referencia a entidad es el atajo que se inserta en un documento de XML para representar una entidad. Una entidad es el contenido que sustituye a la referencia a entidad cuando se procesa el documento de XML.


Referencias a entidades internas analizadas

Las referencias a entidades internas analizadas son básicamente atajos para una cadena de caracteres que probablemente se vaya a utilizar mucho en un determinado documento de XML. El formato para declarar una referencia a entidad interna analizada en una DTD es el siguiente:

<!ENTITY nombre_entidad "texto de sustitución">

Por ejemplo, supongamos que va a crear un documento de XML que contenga una lista de empleados y algunos datos sobre cada uno. El registro de cada empleado tiene que contener la frase "Años con la empresa:", seguida de un número. En vez de escribir manualmente la frase repetidas veces, puede crear una referencia a entidad interna analizada para la frase como parte de la DTD del documento; por ejemplo:

<!-- El elemento raíz es <lista_empleados>. -->
<!DOCTYPE lista_empleados [
<!-- La DTD empieza aquí. -->
<!ENTITY yrs "Años con la empresa:">
<!ELEMENT lista_empleados (empleado*)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT número_identificación (#PCDATA)>
<!ELEMENT años_con_empresa (#PCDATA)>
<!ELEMENT empleado (nombre, número_identificación, años_con_empresa)>
]>

Para utilizar la referencia a entidad interna analizada "yrs" en el documento de XML, se podría hacer lo siguiente:

<empleado>
<nombre>Alejandro Barrios</nombre>
<número_identificación>H867KL671BR</número_identificación>
<años_con_empresa>&yrs; 12</años_con_empresa>
</empleado>

En el momento de procesar este elemento <empleado>, el procesador de XML ampliará la referencia a entidad interna analizada, generando como resultado el siguiente XML:

<empleado>
<nombre>Alejandro Barrios</nombre>
<número_identificación>H867KL671BR</número_identificación>
<años_con_empresa>Años con la empresa: 12</años_con_empresa>
</empleado>

En XML se dispone de cinco referencias predefinidas a entidades internas analizadas. A diferencia de las demás referencias a entidades internas analizadas, éstas forman parte de la especificación XML y no es necesario declararlas.

CarácterReferencia a entidad
<&lt;
>&gt;
&&amp;
"&quot;
'&apos;

Por ejemplo, supongamos que necesita utilizar el signo mayor que (>) en el contenido de sus documentos de XML. Como ya sabe, el signo mayor que indica el cierre de una etiqueta en XML. A fin de evitar complicaciones con el procesador de XML, puede sustituir todos los casos del signo mayor que por "&gt;". Por ejemplo, para expresar "un todo > la suma de sus partes" en un archivo de XML, se podría hacer lo siguiente:

<tópico>
un todo &gt; la suma de sus partes
</tópico>

Existen tres restricciones a la hora de utilizar referencias a entidades internas analizadas:

Referencias a entidades externas analizadas

Las referencias a entidades externas analizadas se utilizan para incluir contenido almacenado en un archivo de texto situado externamente. Estas referencias se deben declarar en la DTD mediante una de estas dos maneras:

<!ENTITY nombre_entidad SYSTEM "URL del archivo de referencia">
<!ENTITY nombre_entidad PUBLIC "nombre del archivo de referencia" "URL del archivo de referencia">

En el primer ejemplo se puede emplear el URL de un determinado archivo. El segundo ejemplo permite utilizar el nombre de un recurso, el cual puede a su vez apuntar a un URL; el URL, en este caso, sirve de respaldo y se utiliza sólo si no se puede resolver el nombre.

Las referencias a entidades externas analizadas se pueden utilizar para compartir contenido entre archivos de XML. Por ejemplo, a continuación se ofrece un ejemplo de un documento de XML cuyo contenido se almacena en un archivo de texto con el nombre "mi_archivo.txt" en el sitio Web de Quark™:

<?xml version="1.0" standalone="no">
<!-- El elemento raíz es <mi_raíz>. -->
<!DOCTYPE mi_raíz [
<!-- La DTD empieza aquí. -->
<!ELEMENT mi_raíz ANY>
<!ENTITY xmlContent SYSTEM "http://www.quark.com/mi_archivo.txt">
]>
<!-- El documento empieza aquí. -->
<mi_raíz>
&xmlContent;
</mi_raíz>

Esto resulta útil porque se puede utilizar el mismo contenido de "mi_archivo.txt" en otros archivos de XML.

Si un documento utiliza referencias a entidades externas, el atributo "standalone" en la declaración de XML debe fijarse en "no".


Referencias a entidades externas sin analizar

¿Qué ocurre si se desea hacer referencia a una imagen, hoja de cálculo, archivo de sonido, archivo de HTML u otro archivo que no sea de XML en un documento de XML? No se puede utilizar una referencia a entidad externa analizada porque el procesador de XML intentará analizar el archivo binario, lo que produciría errores.

Para evitar este problema, se introduce una anotación al final de la referencia a entidad externa, la cual instruye al procesador de XML que no analice el archivo de destino, e indica de qué tipo de archivo se trata. El formato para declarar una anotación en una DTD es el siguiente:

<!NOTATION nombre_anotación SYSTEM "nombre_aplicación">

Por ejemplo, para establecer una conexión entre archivos JPEG y Adobe® Photoshop®, se podría añadir a la DTD una anotación como la siguiente:

<!NOTATION jpeg SYSTEM "Adobe Photoshop">

Para emplear una anotación en una declaración de referenica a entidad externa, utilice la siguiente sintaxis:

<!ENTITY nombre_entidad SYSTEM "URL" NDATA nombre_anotación>

Por ejemplo, para crear una entidad con el nombre "mi_imagen" que apunte a un URL que contiene un archivo JPEG, se podría utilizar la siguiente etiqueta:

<!ENTITY mi_imagen SYSTEM "http://www.quark.com/imagen.jpg" NDATA jpeg>

Es asimismo posible utilizar la sintaxis PUBLIC con anotaciones, especificando en primer lugar un nombre de anotación PUBLIC y luego un URL de anotación de respaldo:

<!ENTITY mi_imagen PUBLIC "-//Quark//nombre JPEG ficticio""http://www.quark.com/xml/imagen.jpg" NDATA jpeg>

Otras maneras de hacer referencia a archivos externos: las referencias a entidades sin analizar no constituyen la única manera de hacer referencia a archivos externos en los archivos de XML sin especificar que se deban analizar. También se puede almacenar el URL de uno de dichos archivos como elemento común o contenido de atributo. El primer ejemplo a continuación hace referencia al URL de un archivo de imagen como contenido de elemento, y el segundo ejemplo hace referencia al mismo URL como contenido de atributo:


<mi_imagen>http://www.quark.com.imagen.jpg</mi_imagen>
<mi_imagen URL="http://www.quark.com.imagen.jpg"/>

Cada usuario puede optar por utilizar o no entidades, elementos o atributos sin analizar para hacer referencia a archivos que no sean de XML. Todos estos métodos funcionan igual de bien, siempre que la aplicación que procesa el XML sepa que los URL son exactamente eso, localizadores URL.

Referencias a entidades de parámetro internas

Si desea crear una referencia a entidad que sólo se vaya a utilizar con una determinada DTD, deberá crear una referencia a entidad de parámetro. Las referencias a entidades de parámetro internas son muy parecidas a las referencias a entidades internas analizadas, con la excepción de que comienzan con % en vez de con &, tanto en sus declaraciones como cuando se utilizan:

<!ENTITY % nombre_entidad "definición de entidad">
%nombre_entidad;

Es posible utilizar referencias a entidades de parámetro internas en el subconjunto externo de una DTD, de la misma forma en que se utilizan entidades internas analizadas en un documento de XML. Por ejemplo, a continuación se utiliza una referencia a entidad de parámetro interna para crear un atajo para la referencia a un modelo de contenido que describe el nombre de una persona:

<!ENTITY % nombre "(Nombre, apellido)">
<!ELEMENT nombre_empresario %nombre;>
<!ELEMENT nombre_empleado %nombre;>
<!ELEMENT nombre_cliente %nombre;>

Esto resulta útil porque facilita el proceso de cambiar la definición de todos los tipos de nombres a la vez. Por tanto, si decide, por ejemplo, que desea almacenar también los segundos apellidos de todos los empresarios, empleados y clientes, tan sólo tendría que cambiar la anterior declaración de entidad de parámetro interna a:

<!ENTITY % nombre "(Nombre, primer_apellido, segundo_apellido)">

Tenga en cuenta que este tipo de referencia a entidad de parámetro interna sólo se puede utilizar en el subconjunto externo de una DTD.


Referencias a entidades de parámetro externas

Las referencias a entidades de parámetro externas son muy parecidas a las referencias a entidades externas analizadas, con la excepción de que comienzan con % en vez de con &, tanto en sus declaraciones como cuando se utilizan. Por ejemplo, las dos líneas siguientes (procedentes del subconjunto interno de un documento de XML) crean en primer lugar una referencia a entidad que apunte a una DTD externa con el nombre "cabecera_estándar.dtd" y luego incluyen esa DTD externa en el archivo de XML:

<!ENTITY % cabecera_estándar SYSTEM "cabecera_estándar.dtd">
%cabecera_estándar;

Encontrará más información acerca de esto en "Utilización de definiciones DTD PUBLIC", en este mismo capítulo.

Las referencias a entidades de parámetro sólo se pueden utilizar dentro de una DTD.


Las referencias a entidades de parámetro internas y externas se pueden utilizar conjuntamente. Por ejemplo, se pueden utilizar referencias a entidades de parámetro internas en el subconjunto interno para hacer referencia a entidades que están definidas en el subconjunto externo. Esto resulta útil porque permite cambiar la definición de una entidad sin tener que cambiar el subconjunto interno de los archivos de XML en los que se emplea la entidad. Por tanto, se podría incluir, por ejemplo, la siguiente declaración en un archivo de texto con el nombre "archivo_entidades.txt":

<!ENTITY % nombre_entidad "<!ELEMENT nombre (Nombre, apellido)>">

Y luego incluir lo siguiente en el subconjunto interno de los documentos de XML:

<!-- Incluye el archivo que contiene la entidad anterior -->>
<!ENTITY % archivo_entidades SYSTEM "nombre_entidad.txt">
%archivo_entidades;
<!-- Ahora se llama a la entidad definida en el archivo externo -->
%nombre_entidad;

Esto haría posible cambiar la definición de la referencia a entidad nombre_entidad en todos los documentos de XML deseados modificándola simplemente en el archivo "archivo_entidades.txt".


Definición de atributos

Además de incluir contenido, los elementos también pueden tener atributos (consulte el apartado "En qué consiste XML" en este mismo capítulo). No hay acuerdo generalizado sobre el papel de los atributos; no obstante, a efectos de esta explicación, partiremos de la suposición de que un atributo debe contener información acerca de un elemento que sea importante para el procesador de XML, pero que no forma parte del contenido del archivo de XML en sí.

Por ejemplo, supongamos que está utilizando XML para mantener una lista de libros para su visualización en un sitio Web. La lista puede mostrarse de dos maneras: como una lista completa o como una lista de todos los libros que se hayan añadido a la lista en los últimos 10 días. Para que esto funcione, el documento de XML necesita indicar la fecha en que se introduce cada libro.

Podría añadir una subetiqueta <fecha_entrada> a la definición de la etiqueta <libro>, pero la fecha en que se introduce algún libro en el sistema no es realmente un dato sobre el libro en sí, de modo que quizás decida crear en su lugar un atributo con el nombre "fecha_entrada".

La sintaxis para las declaraciones de atributo es la siguiente:

<!ATTLIST nombre_elemento nombre_atributo tipo_atributo valor_por_omisión>

Por tanto, para asignar al elemento <libro> un atributo "fecha_entrada" con un valor por omisión de "01/01/2000", se añadiría la siguiente línea a la DTD:

<!ATTLIST libro fecha_entrada CDATA "01/01/2000">

Para utilizar posteriormente este atributo en un elemento <libro>, bastaría con utilizar una pareja de valores de atributo; por ejemplo:

<libro fecha_entrada="11/11/1998">
La descripción del libro va aquí.
</libro>

Este atributo suministraría al procesador de XML la información necesaria para mostrar los libros en función de su fecha de entrada.

Atributos requeridos, implícitos y fijos

Cada atributo puede ser requerido, implícito o fijo. Un valor por omisión de atributo requerido especifica que el elemento debe contener este atributo. Por ejemplo, la siguiente declaración de atributo especifica que cada elemento <libro> debe tener un atributo "fecha_entrada":

<!ATTLIST libro fecha_entrada CDATA #REQUIRED>

Un valor por omisión de atributo implícito indica que el elemento puede o no contener este atributo, a criterio del autor del archivo de XML. Por ejemplo, la siguiente declaración de atributo especifica que cada elemento <libro> puede o no contener un atributo "fecha_entrada":

<!ATTLIST libro fecha_entrada CDATA #IMPLIED>

Un valor por omisión de atributo fijo indica que el atributo debe contener un valor exacto para cada elemento. Por ejemplo, la siguiente declaración de atributo especifica que todos los elementos <libro> deben tener un valor "fecha_entrada" que sea igual a "11/11/1998":

<!ATTLIST libro fecha_entrada CDATA #FIXED "11/11/1998">

En este ejemplo, el procesador de XML partirá de la suposición de que todos los elementos <libro> tienen un atributo "fecha_entrada" fijado en "11/11/1998", aunque se omita el atributo.

Si una declaración de atributo tiene un valor por omisión, pero no especifica #REQUIRED, #IMPLIED o #FIXED, el procesador de XML utilizará el valor por omisión del atributo cada vez que se omita éste.


Tipos de atributos

La palabra clave CDATA en nuestro ejemplo de declaración de atributo indica que queremos que el atributo contenga datos alfanuméricos. Sin embargo, CDATA es sólo una opción para el tipo de atributo. La lista completa se reproduce a continuación.

<!-- En la DTD -->
<!ENTITY portada_por_omisión SYSTEM "sin_portada.jpg" NDATA jpg>
<!ENTITY mi_portada SYSTEM "mi_portada_libro.jpg" NDATA jpg>
...
<!ATTLIST libro portada ENTITY portada_por_omisión>

<!-- En el cuerpo del XML -->
<libro portada="mi_portada">
La descripción del libro va aquí.
</libro>

<!-- En la DTD -->
<!ENTITY mi_portada SYSTEM "mi_portada_libro.jpg" NDATA jpg>
<!ENTITY mi_autor SYSTEM "mi_autor_libro.jpg" NDATA jpg>
...
<!ATTLIST libro dibujos ENTITIES #IMPLIED>

<!-- En el cuerpo del XML -->
<libro dibujos="mi_portada mi_autor">
La descripción del libro va aquí.
</libro>

<!ATTLIST libro estado_venta (de_rebajas | precio_normal) #IMPLIED>

<!-- En la DTD -->
<!ATTLIST libro número_libro ID #REQUIRED>

<!-- En el cuerpo del XML -->
<libro número_libro="B068157">
La descripción del libro va aquí.
</libro>

Un atributo ID debe tener un valor por omisión declarado de #IMPLIED o #REQUIRED. Ningún elemento puede tener más de un atributo ID.


<!-- En la DTD -->
<!ATTLIST libro número_libro ID #REQUIRED>
<!ATTLIST libro catalogado_en IDREF #REQUIRED>

<!-- En el cuerpo del XML -->
<libro número_libro="B000321">
Un catálogo de libros sobre hierbas.
</libro>

<libro número_libro="B000123" catalogado_en="B000321">
Un libro sobre hierbas.
</libro>

<!-- En la DTD -->
<!ATTLIST libro nombre_local NMTOKEN #IMPLIED>

<!-- En el cuerpo del XML -->
<libro nombre_local="Mi nombre local">
La descripción del libro va aquí.
</libro>

<!-- En la DTD -->
<!ATTLIST libro_XML tipo_tema NMTOKENS #IMPLIED (xml xsl otro)>

<!-- En el cuerpo del XML -->
<libro_XML tipo_tema="xml">
La descripción del libro va aquí.
</libro>

<!-- En la DTD -->
<!NOTATION jpg SYSTEM "PictureViewer">
<!NOTATION mov SYSTEM "MoviePlayer"

<!ELEMENT elemento_multimedia EMPTY>
<!ATTLIST elemento_multimedia archivo ENTITY #REQUIRED>
<!ATTLIST elemento_multimedia tipo NOTATION #REQUIRED>

<!-- En el cuerpo del XML -->
<elemento_multimedia archivo="mi_imagen.jpg" tipo="jpg"/>
<elemento_multimedia archivo="mi_película.mov" tipo="mov"/>

Ningún elemento puede tener más de un atributo NOTATION.


<!-- En la DTD -->
<!NOTATION picViewer SYSTEM "PictureViewer">
<!NOTATION photoshop SYSTEM "Photoshop.exe">
<!NOTATION movPlyrMac SYSTEM "MoviePlayer">
<!NOTATION movPlyrWin SYSTEM "Movieplayer.exe">

<!ELEMENT imagen EMPTY>
<!ATTLIST imagen archivo ENTITY #REQUIRED>
<!ATTLIST imagen aplicación_imágenes NOTATION (picViewer | photoshop) #REQUIRED>

<!ELEMENT película EMPTY>
<!ATTLIST película archivo ENTITY #REQUIRED>
<!ATTLIST película aplicación_películas NOTATION (movPlyrMac | movPlyrWin) #REQUIRED>

<!-- En el cuerpo del XML -->
<imagen archivo="mi_imagen.jpg" aplicación_imágenes="picViewer"/>
<película archivo="mi_película.mov" aplicación_películas="movPlyrMac"/>

En este ejemplo, en vez de crear un elemento para imágenes y películas, se crean dos elementos separados: <imagen> y <película>. Para cada uno de estos elementos, la DTD especifica dos aplicaciones diferentes que podrían emplearse para ver el archivo. La determinación de qué aplicación se debe utilizar se realiza en cada etiqueta <ELEMENT> individual dentro del cuerpo del XML.

El atributo xml:lang

El atributo "xml:lang" permite especificar el idioma que se utiliza en un elemento. Este atributo debe contener una de los siguientes componentes:

Tenga en cuenta que estos atributos no están predefinidos; es necesario declararlos antes de utilizarlos.


Para indicar el idioma deseado, basta con asignar el código de ese idioma. Por ejemplo, la siguiente DTD especifica un elemento "xml:lang", y el elemento en el cuerpo del XML especifica el idioma inglés mediante ISO 639:

<!-- En la DTD -->
<!ELEMENT Párrafo (#PCDATA)>
<!ATTLIST Párrafo xml:lang NMTOKEN #REQUIRED>

<!-- En el cuerpo del XML -->
<Párrafo xml:lang="en">
Los datos del párrafo van aquí.
</Párrafo>

Si se desea especificar subtipos de idioma, se añade una extensión con guión al nombre del idioma. Por ejemplo, el siguiente elemento especifica inglés internacional (utilizado en Gran Bretaña), en vez del inglés norteamericano:

<!-- En el cuerpo del XML -->
<Párrafo xml:lang="en-GB">
Los datos del párrafo van aquí.
</Párrafo>

El atributo xml:space

El atributo "xml:space" permite indicar a la aplicación que procesó el XML que debe dejar tal cual todos los espacios en blanco tanto de un elemento como de sus elementos secundarios (a menos que uno de los elementos secundarios restablezca la etiqueta). Por ejemplo, la siguiente DTD especifica un atributo "xml:space", y el elemento en el cuerpo del XML establece ese atributo en "conservar" para ese elemento y sus elementos secundarios:

<!-- En la DTD -->
<!ELEMENT Párrafo (#PCDATA)>
<!ATTLIST Párrafo xml:space (por omisión | conservar) "por omisión">

<!-- En el cuerpo del XML -->
<Párrafo xml:space="conservar">
Los datos del párrafo van aquí.
Se conserva
todo
el espacio
en blanco.
</ Párrafo>


IGNORE e INCLUDE

La etiqueta <![IGNORE[]]> se puede utilizar para indicar al analizador de XML que pase por alto un segmento de texto en una DTD externa. Fíjese en el siguiente ejemplo:

<-- Esta declaración de elemento se analiza como siempre: -->
<!ELEMENT paso_estudiante (#PCDATA)>
<![IGNORE[
<-- El analizador de XML pasa por alto esta declaración de elemento: -->
<!ELEMENT nota_instructor (#PCDATA)>
]]>

Es posible indicar al analizador de XML que analice el texto dentro de las etiquetas, cambiando simplemente IGNORE a INCLUDE; por ejemplo:

<-- Esta declaración de elemento se analiza como siempre: -->
<!ELEMENT paso_estudiante (#PCDATA)>
<![INCLUDE[
<-- Esta declaración de elemento ahora se analiza también como siempre: -->
<!ELEMENT nota_instructor (#PCDATA)>
]]>


Utilización de definiciones DTD PUBLIC

Como hemos mencionado anteriormente, se puede hacer referencia a una DTD externa en la declaración DOCTYPE de un documento de XML; por ejemplo:

<?xml version="1.0" standalone="no">
<!-- La DTD empieza aquí. -->
<!DOCTYPE mi_documento SYSTEM "mi_documento.dtd">
<!-- El documento empieza aquí. -->
<mi_documento>
...

Si está utilizando una DTD que se ha aprobado por una institución como la Organización Internacional de Normas (International Standards Organization; ISO), puede emplear una referencia a entidad PUBLIC que especifica el nombre de una copia de la DTD disponible para el público. Si lo hace, deberá asimismo suministrar el URL de un archivo SYSTEM DTD, el cual sirve de respaldo en caso de que no se disponga de una copia PUBLIC de la DTD.

<?xml version="1.0" standalone="no">
<!-- La DTD empieza aquí. -->
<!-- El primer URL abajo es PUBLIC DTD, el segundo es SYSTEM DTD de respaldo. -->
<!DOCTYPE documento_estándar PUBLIC "-//Quark//DTD stdDoc 1.0//EN" "http://www.quark.com/xml/stdDoc.dtd">
<!-- El documento empieza aquí. -->
<documento_estándar>
...


Combinación de definiciones DTD para crear DTD compuestas

En algunas situaciones, puede que sea necesario crear DTD separadas para definir partes diferentes de un documento. Por ejemplo, es posible que su empresa utilice una DTD para toda la información de cabecera y de pie de página de los archivos de XML, pero distintas DTD para el cuerpo de los documentos producidos en partes diferentes de la empresa. Para adaptarse a situaciones como ésta, tan sólo se tiene que crear una nueva DTD individual que incluya las diversas DTD que se necesiten y que especifique un orden para los elementos raíz; por ejemplo:

<!ENTITY % cabecera_estándar SYSTEM "cabecera_estándar.dtd">
<!ENTITY % informe_calidad SYSTEM "informe_calidad.dtd">
<!ENTITY % pie_página_estándar SYSTEM "pie_página_estándar.dtd">
%cabecera_estándar;
%informe_calidad;
%pie_página_estándar;
<!-- El elemento raíz es <doc_inform_calidad> -->
<!ELEMENT doc_inform_calidad (cabecera_estándar, informe_calidad, pie_página_estándar)>

En el caso de documentos creados con esta DTD, <doc_inform_calidad> sería el elemento raíz, y <cabecera_estándar>, <informe_calidad> y <pie_página_estándar> serían sus subelementos inmediatos. A continuación se ofrece un ejemplo de la estructura posible de un documento que utiliza esta DTD:

<?xml version="1.0" standalone="no">
<!-- La siguiente línea especifica un elemento raíz (<doc_inform_calidad>) y apunta al URL del archivo de una DTD externa con el nombre "doc_inform_calidad.dtd". -->
<!DOCTYPE doc_inform_calidad SYSTEM "doc_inform_calidad.dtd">
<!-- El documento empieza aquí. -->
<doc_inform_calidad>
<cabecera_estándar>
<!-- El contenido de cabecera estándar va aquí. -->
</cabecera_estándar>
<informe_calidad>
<!-- El contenido del informe de control de calidad va aquí. -->
</informe_calidad>
<pie_página_estándar>
<!-- El contenido de pie de página estándar va aquí. -->
</pie_página_estándar>
</doc_inform_calidad>


Realización de modificaciones locales en DTD importadas

Algunos flujos de trabajo podrían utilizar definiciones DTD casi idénticas para un grupo de usos, pero que requieren pequeños ajustes para funcionar en algún departamento o grupo particular. Ajustarse a esta configuración es muy fácil; tan sólo se tiene que incluir la DTD en la declaración DOCTYPE y luego añadir cualquier declaración de marcación necesaria al subconjunto interno.

No se puede redefinir un elemento que ya está definido en la DTD externa, pero es posible redefinir entidades y valores por omisión para atributos.



Validación de un archivo de XML con una DTD

Si redacta los documentos de XML con un programa de tratamiento de textos, podrá leer la DTD correspondiente para asegurarse de seguir las reglas. Sin embargo, no podrá tener la certeza de haberlo hecho correctamente hasta que valide el documento de XML con la DTD utilizando un programa conocido como un analizador de validación. Dicho programa lee la DTD y analiza el archivo de XML para verificar que se adhiere a las reglas de la DTD. Un buen analizador de validación debería indicarle también los problemas que encuentre (si hubiera).

Recuerde que si desea verificar un documento de XML para ver si se atiene a una determinada DTD, necesita un analizador de XML de validación, y no sólo un simple analizador de XML. Existen muchos analizadores de XML que le indicarán si un archivo de XML está bien formado, pero no tantos que le indiquen si el archivo es válido.


Si desea ver una referencia rápida de las características y convenciones de DTD, consulte el Apéndice A, "Referencia rápida para DTD", del capítulo 7, "Apéndices".



Definiciones DTD estándar de la industria

¿Sería mejor desarrollar una nueva DTD, diseñada a medida según las necesidades de su empresa? ¿O convendría utilizar una DTD estándar de la industria que le ahorrará tiempo de desarrollo y ayudará a garantizar que pueda intercambiar información con otras empresas en su industria?

Las dos opciones tienen sus ventajas. Si crea su propia DTD desde cero, tiene control total sobre la estructura de la DTD y el proceso de actualizarla. Sin embargo, esta alternativa implica una inversión considerable de tiempo y esfuerzo, y debe considerar cuidadosamente las necesidades de todos los que vayan a utilizar la DTD. Si utiliza una DTD estándar de la industria, no tiene que pasar por el proceso de desarrollo de la DTD, pero tendrá que seguir las convenciones de la misma y atenerse a la estructura que define.


Los pros y los contras de utilizar definiciones DTD estándar de la industria

Si piensa intercambiar información con otras empresas, una DTD estándar de la industria podría ser la solución adecuada, ya que ayuda a garantizar el intercambio de datos sin problemas y que la información etiquetada pueda volver a utilizarse en otros contextos. De hecho, éste es uno de los motivos impulsores del desarrollo de XML: ayudar a estandarizar los formatos en que la información se almacena y se intercambia.

No obstante, la utilización de una DTD estándar de la industria no está exenta de sus propios desafíos. Dos empresas pueden tener necesidades diferentes, aunque los datos que manejan sean básicamente los mismos. Las DTD estándar de la industria se pueden modificar para su uso en una empresa, pero esta práctica va en contra del objetivo de las mismas: garantizar que la información se almacene en un formato uniforme entre empresas.


¿Puedo utilizar una DTD estándar de la industria?

Esto depende de varios factores.

¿Existe una DTD estándar para su industria?

Para obtener la respuesta a esta pregunta, puede buscar definiciones DTD estándar de la industria en la Web. Destacan dos sitios buenos donde recabar información: www.schema.net y www.xml.org.

Si existe una DTD estándar para su industria, ¿satisface sus necesidades?

Examine detenidamente esta cuestión; si la DTD que elige no satisface sus necesidades, el efecto acumulativo de cualquier defecto sólo crecerá con el tiempo.

Si no existe ninguna DTD estándar para su industria, ¿se encuentra alguna en fase de desarrollo?

Si no puede encontrar una DTD estándar de la industria adecuada para las necesidades de su empresa, conviene averiguar si otra empresa está desarrollando una. En caso afirmativo, podría ser una oportunidad para que su empresa aporte sus conocimientos especializados al desarrollo de la DTD. La participación en el desarrollo de una DTD estándar de la industria ayuda a evitar problemas que pueden surgir de la utilización de una DTD desarrollada por un tercero que no conozca los aspectos relevantes de su situación.


Adaptación de definiciones DTD estándar de la industria

Algunas empresas optan por utilizar una DTD estándar de la industria, pero la modifican para ajustarla a sus necesidades particulares. Por ejemplo, con objeto de hacer que la DTD "libro" para SGML, compatible con las normas ISO funcione para sus necesidades, University of California Press efectuó una serie de ajustes a la misma, añadiendo elementos que les permitiesen almacenar información tal como subtítulos de capítulo y líneas de firma específicas de cada capítulo. La ISO (Organización Internacional de Normas) proporciona pautas para la modificación de sus DTD; por tanto, aunque realice modificaciones de este tipo, la nueva DTD seguirá siendo algo estandarizada.

¿Qué ocurre si necesita intercambiar datos con otras empresas que utilizan la DTD original sin modificar? Algunas empresas optan por crear utilidades que puedan convertir documentos que se atienen a su DTD modificada en documentos que se atengan al formato original de la DTD. Este tipo de solución brinda muchas de las ventajas que se obtienen al tener una DTD personalizada, pero sigue posibilitando el intercambio de datos con otras empresas en la industria.


Ejemplo de un caso hipotético de avenue.quark

Avenue.quark permite utilizar una DTD para extraer contenido estructurado de los documentos de QuarkXPress Passport y almacenarlo en el sistema de archivos o en una base de datos. En el siguiente apartado se describe el funcionamiento del proceso mediante una situación de ejemplo.


La situación

Supongamos que su empresa ha creado una cantidad grande de documentos técnicas en formato QuarkXPress Passport y desea exportar su contenido a formato XML y almacenarlo en una base de datos para que pueda ponerlo a disposición de sus clientes a través de la Web. Todos los documentos técnicos utilizan las mismas hojas de estilo y plantilla de QuarkXPress Passport.


Paso 1: Crear o elegir una DTD

Antes de que pueda extraer el contenido de los documentos técnicos y ponerlo en un formato estructurado, debe contar con una estructura para contenerlo. La DTD proporciona esa estructura.

Encontrará más información acerca de las definiciones DTD en el apartado "Utilización de definiciones DTD", en este mismo capítulo.


Hay dos maneras de obtener una DTD para su uso con avenue.quark:


Paso 2: Crear un documento de XML

Cree un nuevo documento de XML en avenue.quark y especifique la DTD que eligió en el paso 1. Todo elemento obligatorio en la DTD se insertará automáticamente en el documento de XML.

Paleta Espacio de trabajo de XML para un nuevo documento de XML


Paso 3: Crear un conjunto de reglas de etiquetado

Una de las características exclusivas de avenue.quark es el etiquetado a base de reglas. Se crea un conjunto de reglas de etiquetado que indican a avenue.quark, por ejemplo, que cualquier párrafo que utilice la hoja de estilo "Titular" debe recibir la etiqueta <Título>. Los conjuntos de reglas de etiquetado se pueden utilizar también para especificar las etiquetas que deben recibir determinadas hojas de estilo de caracteres, colores de texto y estilos de formato local. (Encontrará más información acerca de los conjuntos de reglas de etiquetado en el capítulo 5, "Conjuntos de reglas de etiquetado".)


Paso 4. Guardar el documento de XML como plantilla

Guarde el documento de XML como plantilla con el nombre "Nota_técn.xmt". La plantilla contiene la DTD para documentos técnicos y el conjunto de reglas de etiquetado que creó en el paso 3. Podrá utilizar esta plantilla para crear todos los archivos de XML que desee, en el mismo ordenador o en diferentes ordenadores.


Paso 5. Abrir el documento de QuarkXPress Passport que desee etiquetar


Paso 6. Crear un nuevo documento de XML basado en la plantilla de XML para documentos técnicos

A la hora de crear un nuevo documento de XML de avenue.quark, lo primero que debe hacer es elegir una plantilla de la lista Plantilla para basar el nuevo documento de XML en la misma. Para este ejemplo, utilizaremos la plantilla "Nota_técn.xmt" del paso 4.

La plantilla Nota_técn.xmt facilita el etiquetado de un documento técnico de QuarkXPress Passport.


Paso 7. Realizar el etiquetado basado en reglas

Para realizar el etiquetado basado en reglas, pulse la tecla C (Mac OS) o Ctrl (Windows) y arrastre el cuadro que contiene el documento técnico hasta el elemento <Nota_técn> en la lista de desplazamiento Árbol de XML. Avenue.quark etiquetará automáticamente el documento utilizando las reglas del conjunto de reglas de etiquetado.

Para utilizar el etiquetado basado en reglas, basta con que pulse la tecla C (Mac OS) o Ctrl (Windows) y arrastre el cuadro hasta el elemento adecuado en la lista Árbol de XML. Avenue.quark utilizará el conjunto de reglas de etiquetado para etiquetar todo el contenido que pueda.


Paso 8. Realizar cualquier etiquetado manual necesario

Es posible que, una vez terminado el etiquetado basado en reglas, ya estén completamente preparados algunos de los documentos técnicos. No obstante, puede que otras tengan contenido adicional que necesita ser etiquetado o contenido que se puede etiquetar de varias formas. Para resolver estas situaciones, tan sólo tiene que arrastrar el contenido en cuestión hasta el elemento adecuado en la paleta Espacio de trabajo de XML.


Paso 9. Utilizar el contenido estructurado en la Web y en otros lugares

Una vez que el contenido de los documentos técnicos esté en formato XML, podrá utilizar diversas herramientas para ponerlo en la Web. Por ejemplo, podrá difundirlo como XML puro y visualizarlo utilizando un examinador de Web de nueva generación, como Microsoft Internet Explorer 5.0. El contenido etiquetado en XML también se puede utilizar de otras maneras, desde el intercambio electrónico de información hasta la generación de documentos impresos.